// utils/base64.js - Base64编码解码工具（小程序兼容）

/**
 * Base64字符表
 */
const CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';

/**
 * Base64解码函数（替代浏览器的atob）- 支持UTF-8
 * @param {string} input - 要解码的Base64字符串
 * @returns {string} 解码后的字符串
 */
function atob(input) {
  input = String(input);
  let str = input.replace(/[=]+$/, ''); // 移除padding
  let output = '';
  
  if (str.length % 4 === 1) {
    throw new Error('Invalid Base64 input length');
  }
  
  for (let bc = 0, bs = 0, buffer, i = 0; str.charAt(i) || (buffer = '=', i % 4); output += String.fromCharCode(255 & buffer >> (-2 * i & 6))) {
    buffer = CHARS.indexOf(str.charAt(i++));
    if (buffer === -1) {
      throw new Error('Invalid Base64 character');
    }
    buffer = bc % 4 ? buffer * 64 + bs : buffer;
    bs = bc++ % 4 ? bs : buffer;
  }
  
  return output;
}

/**
 * Base64 URL解码函数（JWT标准）- 微信小程序专用版本
 * @param {string} str - Base64 URL编码的字符串
 * @returns {string} 解码后的UTF-8字符串
 */
function base64UrlDecode(str) {
  try {
    // 第一步：Base64 URL转换为标准Base64
    let base64 = str.replace(/-/g, '+').replace(/_/g, '/');
    
    // 第二步：添加padding
    while (base64.length % 4) {
      base64 += '=';
    }
    
    // 第三步：优先使用微信小程序原生方法（最可靠）
    if (typeof wx !== 'undefined' && wx.base64ToArrayBuffer) {
      try {
        const arrayBuffer = wx.base64ToArrayBuffer(base64);
        // 使用Uint8Array处理字节数据
        const bytes = new Uint8Array(arrayBuffer);
        
        // 手动UTF-8解码（避免TextDecoder兼容性问题）
        let result = '';
        let i = 0;
        while (i < bytes.length) {
          const byte1 = bytes[i++];
          
          if (byte1 < 0x80) {
            // 单字节字符（ASCII）
            result += String.fromCharCode(byte1);
          } else if ((byte1 & 0xE0) === 0xC0) {
            // 双字节字符
            const byte2 = bytes[i++];
            result += String.fromCharCode(((byte1 & 0x1F) << 6) | (byte2 & 0x3F));
          } else if ((byte1 & 0xF0) === 0xE0) {
            // 三字节字符（大部分中文）
            const byte2 = bytes[i++];
            const byte3 = bytes[i++];
            result += String.fromCharCode(((byte1 & 0x0F) << 12) | ((byte2 & 0x3F) << 6) | (byte3 & 0x3F));
          } else if ((byte1 & 0xF8) === 0xF0) {
            // 四字节字符
            const byte2 = bytes[i++];
            const byte3 = bytes[i++];
            const byte4 = bytes[i++];
            let codePoint = ((byte1 & 0x07) << 18) | ((byte2 & 0x3F) << 12) | ((byte3 & 0x3F) << 6) | (byte4 & 0x3F);
            
            if (codePoint > 0xFFFF) {
              codePoint -= 0x10000;
              result += String.fromCharCode(0xD800 + (codePoint >> 10));
              result += String.fromCharCode(0xDC00 + (codePoint & 0x3FF));
            } else {
              result += String.fromCharCode(codePoint);
            }
          }
        }
        return result;
      } catch (e) {
        console.error('wx.base64ToArrayBuffer方法失败:', e);
      }
    }
    
    // 备用方法：使用escape/unescape（适合微信小程序环境）
    try {
      const decoded = atob(base64);
      // 使用escape/unescape处理UTF-8编码
      return decodeURIComponent(escape(decoded));
    } catch (e) {
      console.error('备用解码方法失败:', e);
      
      // 最后兜底：直接返回atob结果
      return atob(base64);
    }
  } catch (error) {
    console.error('base64UrlDecode完全失败:', error);
    throw error;
  }
}



/**
 * Base64编码函数（替代浏览器的btoa）
 * @param {string} input - 要编码的字符串
 * @returns {string} 编码后的Base64字符串
 */
function btoa(input) {
  input = String(input);
  let str = '';
  
  for (let bc = 0, bs = 0, buffer, i = 0; i < input.length || buffer === ''; buffer = input.charAt(i++)) {
    buffer = buffer.charCodeAt(0);
    
    if (buffer > 255) {
      throw new Error('String contains an invalid character');
    }
    
    buffer = bc % 3 ? buffer * 256 + bs : buffer;
    bs = bc++ % 3 ? bs : buffer;
    str += CHARS.charAt(63 & buffer >> 8 - bc % 3 * 2);
  }
  
  return str.slice(0, str.length - str.length % 4) + '===='.slice(str.length % 4 || 4);
}

/**
 * 解析JWT Token - 修复版本
 * @param {string} token - JWT token字符串
 * @returns {object|null} 解析后的payload对象，失败返回null
 */
function parseJWT(token) {
  try {
    if (!token || typeof token !== 'string') {
      return null;
    }
    
    const parts = token.split('.');
    if (parts.length !== 3) {
      return null;
    }
    
    // 解码payload部分
    const payload = parts[1];
    
    try {
      const decoded = base64UrlDecode(payload);
      return JSON.parse(decoded);
    } catch (error) {
      console.error('JWT解析失败:', error);
      return null;
    }
  } catch (error) {
    console.error('JWT解析完全失败:', error);
    return null;
  }
}

/**
 * 从JWT Token中获取用户ID
 * @param {string} token - JWT token字符串
 * @returns {string|number|null} 用户ID，失败返回null
 */
function getUserIdFromToken(token) {
  try {
    const payload = parseJWT(token);
    if (!payload) {
      return null;
    }
    
    // 尝试从不同字段获取用户ID
    return payload.userId || payload.sub || payload.id || payload.user_id || null;
  } catch (error) {
    console.error('获取用户ID失败:', error);
    return null;
  }
}


module.exports = {
  atob,
  btoa,
  base64UrlDecode,
  parseJWT,
  getUserIdFromToken
};
